package com.wuyb.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wuyb.pojo.User;
import com.wuyb.pojo.entity.BaseResponse;
import com.wuyb.pojo.param.*;
import com.wuyb.util.JwtTokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.security.Principal;

/**
 * 用户服务类
 *
 * @Author: wyb
 * @Date: 2024/01/03/13:40
 * @Description:
 */
public interface UserService extends IService<User> {

    /**
     * 登录
     *
     * @param users
     * @param request
     * @param jwtTokenUtil
     * @param userDetailsService
     * @param passwordEncoder
     * @return
     */
    BaseResponse<?> login(UserLoginParam users, HttpServletRequest request, JwtTokenUtil jwtTokenUtil, UserDetailsService userDetailsService, PasswordEncoder passwordEncoder);

    /**
     * 注册
     * @param users
     * @param request
     * @param passwordEncoder
     * @return
     */
    BaseResponse<?> register(UserRegisterParam users, HttpServletRequest request, PasswordEncoder passwordEncoder);

    /**
     * 获取当前登录的用户信息
     *
     * @param principal
     * @return
     */
    BaseResponse<?> getAdminInfo(Principal principal, HttpServletRequest servletRequest);

    /**
     * 分页获取用户信息
     * @param current
     * @param size
     * @return
     */
    BaseResponse<?> select(Integer current, Integer size);


    /**
     * 添加用户信息
     * @param users
     * @param passwordEncoder
     * @return
     */

    BaseResponse<?> add(UserAddParam users, PasswordEncoder passwordEncoder);

    /**
     * 更新用户信息
     * @param users
     * @param uid
     * @param passwordEncoder
     * @return
     */
    BaseResponse<?> update(UserUpdateParam users, Integer uid, PasswordEncoder passwordEncoder);

    /**
     * 通过ID删除用户信息
     * @param uid
     * @return
     */
    BaseResponse<?> delete(Integer uid);

    /**
     * 设置管理员
     *
     * @param param
     * @return
     */
    BaseResponse<?> setAdmin(UserSetAdminParam param);

    /**
     * 设置头像
     *
     * @param param
     * @return
     */
    BaseResponse<?> setHeadImg(UserSetImgParam param);

    ///**
    // * 设置面部照片
    // *
    // * @param param
    // * @return
    // */
    //BaseResponse<?> setFaceImg(UserSetImgParam param);


    /**
     * 会议签到
     *
     * @param param
     * @param meetingId
     * @return
     */
    BaseResponse<?> signIn(ImgBase64Param param, String meetingId);

    /**
     * 是否已经签到
     *
     * @param meetingId
     * @return
     */
    BaseResponse<?> hadSignIn(String meetingId);

    /**
     * 通过姓名获取该用户的信息
     *
     * @param userName
     * @return
     */
    BaseResponse<?> getUserInfoByName(String userName);

    /**
     * 发送好友申请
     *
     * @param userid
     * @return
     */
    BaseResponse<?> sendFriApplication(Integer userid);

    /**
     * 回应好友申请
     *
     * @param userid
     * @param result 0 忽略 1 同意
     * @return
     */
    BaseResponse<?> replyFriApplication(Integer userid, Integer result);

    /**
     * 查看好友申请列表(未读)
     *
     * @return
     */
    BaseResponse<?> getFriApplications(Integer current, Integer size);

    /**
     * 根据userid删除好友
     *
     * @param userid
     * @return
     */
    BaseResponse<?> delFriendById(Integer userid);

    /**
     * 查看好友列表
     *
     * @return
     */
    BaseResponse<?> getFriendsAndChat(Integer current, Integer size);

    /**
     * 查看与好友聊天记录
     *
     * @param userid
     * @return
     */
    BaseResponse<?> getFriChat(Integer userid, Integer current, Integer size);

    /**
     * 向好友发送消息
     *
     * @param userid
     * @param conetent
     * @return
     */
    BaseResponse<?> sendFriChat(Integer userid, String conetent);

    /**
     * 通过uid获取该用户的信息
     *
     * @param uid
     * @return
     */
    BaseResponse<?> getUserInfoById(Integer uid);

    /**
     * 读取好友聊天信息
     * @param userid
     * @return
     */
    BaseResponse<?> readFriChat(Integer userid);


    /**
     * 本人更新个人信息
     * @param users
     * @return
     */
    BaseResponse<?> updateOwnerInfo(UserUpdateWithOwnerParam users);


    /**
     * 更新本人密码
     * @param users
     * @param passwordEncoder
     * @param request
     * @return
     */
    BaseResponse<?> updateOwnerPass(UserUpdatePasswordParam users, PasswordEncoder passwordEncoder, HttpServletRequest request);
    


    /**
     * 根据用户名获取用户信息，用于jwt验证
     * @param username
     * @return
     */
    UserDetails getUserByUserName(String username);

    /**
     * 退出登录
     * @return
     */
    BaseResponse<?> logout();
}
